package org.example.pcbcircuitboard.service;

import com.aliyun.oss.OSS;
import com.aliyun.oss.model.PutObjectResult;
import com.fasterxml.jackson.databind.JsonNode;
import org.example.pcbcircuitboard.dao.PCBMapper;
import org.example.pcbcircuitboard.entity.PCBEntity;
import org.example.pcbcircuitboard.entity.SSEConnectEntity;
import org.example.pcbcircuitboard.pojo.FaultTypePojo;
import org.example.pcbcircuitboard.pojo.ReceptionPojo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Base64;
import java.util.Date;

/**
 * 封装数据 接收服务 | 数据库 存储 | OSS 存储
 */
@Service
public class ReceptionService {
    @Value("${aliyun.oss.bucket}")
    private String bucket;
    @Value("${aliyun.oss.urlPrefix}")
    private String urlPrefix;
    @Autowired
    private PCBMapper pcbMapper;
    @Autowired
    private OSS ossClient;
    /**
     * 处理数据  左上 可视化数据推送
     * @param jsonData 接收到的json数据
     * @return 是否处理成功
     */
    public boolean processData(JsonNode jsonData) {
        try {
            // 获取当前时间戳
            Date date=new Date();
            SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmss");
            String time=sdf.format(date);
            // 创建数据对象
            ReceptionPojo receptionPojo=new ReceptionPojo();
            receptionPojo.setName(jsonData.path("product").path("model").asText());
            receptionPojo.setBatch(jsonData.path("product").path("batch").asText());
            receptionPojo.setSerial(jsonData.path("product").path("batch").asText()+time);
            receptionPojo.setLevelId(jsonData.path("location").path("slot").asText());
            receptionPojo.setTimestamp(jsonData.path("timestamp").asText());
            receptionPojo.setReception(jsonData.path("has_defects").asText().equals("true")?0:1);
            receptionPojo.setReceptionDetails(jsonData.path("location").path("rack").asText()+"号架-"+jsonData.path("location").path("slot").asText()+"槽");
            JsonNode defects=jsonData.path("defects");
            if(defects.isArray()){
                for(JsonNode defect:defects){
                    FaultTypePojo faultTypePojo=new FaultTypePojo();
                    faultTypePojo.setType(defect.path("type").asText());
                    faultTypePojo.setConfidence(defect.path("confidence").asText());
                    faultTypePojo.setLocation(defect.path("location").asText());
                    receptionPojo.setListFaultType(faultTypePojo);
                }
            }
            // 存储图片
            String base64Img=jsonData.path("image").path("thumbnail").asText();
            receptionPojo=ossPutImg(base64Img,receptionPojo);
            receptionPojo.setStatus(0);
//            TODO sse实时发送数据
            SseEmitter sseEmitter= SSEConnectEntity.getEmitterConnection(SSEConnectEntity.leftTopUserId);
            sseEmitter.send(receptionPojo);
//            TODO 存储数据
            insertReception(receptionPojo);
            return true;
        }catch (Exception e){
            System.out.println(e.getMessage());
            return false;
        }

    }
    /**
     * 检测数据存储
     * @param receptionPojo 接收到的json数据
     */
    public void insertReception(ReceptionPojo receptionPojo) {
        try {
            // 判断是否有故障
            if (!receptionPojo.getDefects().isEmpty()){
                // 插入所有错误
                for (FaultTypePojo faultTypePojo : receptionPojo.getDefects()){
                    PCBEntity pcbEntity=new PCBEntity();
                    pcbEntity.setName(receptionPojo.getName());
                    pcbEntity.setType(receptionPojo.getSerial());
                    pcbEntity.setBatch(receptionPojo.getBatch());
                    pcbEntity.setHasDefect(receptionPojo.getReception());
                    pcbEntity.setDefectName(faultTypePojo.getType());
                    pcbEntity.setOssPath(receptionPojo.getOssPath());
                    pcbMapper.insertPcbData(pcbEntity);
                }
            }else {
                // 插入没有故障的PCB数据
                PCBEntity pcbEntity=new PCBEntity();
                pcbEntity.setName(receptionPojo.getName());
                pcbEntity.setType(receptionPojo.getSerial());
                pcbEntity.setBatch(receptionPojo.getBatch());
                pcbEntity.setHasDefect(receptionPojo.getReception());
                pcbEntity.setOssPath(receptionPojo.getOssPath());
                pcbMapper.insertPcbData(pcbEntity);
            }
        }catch (Exception e){
            System.out.println(e.getMessage());
        }
    }
    /**
     * OSS 对象存储 | 存储对象
     * @param base64Img 图片base64编码
     * @param receptionPojo 接收到的json数据
     * @return 接收到的json数据
     */
    public ReceptionPojo ossPutImg(String base64Img,ReceptionPojo receptionPojo) throws IOException {
        try {
            byte[] imgBytes= Base64.getDecoder().decode(base64Img);
//            创建临时文件
            File tempFile = File.createTempFile("img", ".jpg");
            FileOutputStream fos=new FileOutputStream(tempFile);
            fos.write(imgBytes);
//            OSS 上传的名字 规则： 产品名称_批次_序列号_时间戳.jpg
            String ossName=receptionPojo.getName()+"_"+receptionPojo.getBatch()+"_"+receptionPojo.getSerial()+"_"+receptionPojo.getTimestamp()+".jpg";
            // TODO 上传到OSS
            PutObjectResult ossResult=ossClient.putObject(bucket, ossName, tempFile);
            // TODO 释放临时文件
            tempFile.delete();
            // TODO 更新receptionPojo
            receptionPojo.setOssPath(urlPrefix+"/"+ossName);
            return receptionPojo;
        }catch (Exception e){
            System.out.println(e.getMessage()+" | oss上传失败");
            InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("static/dlb.jpg");;
            // 从资源中读取图片
            String ossName=receptionPojo.getName()+"_"+receptionPojo.getBatch()+"_"+receptionPojo.getSerial()+"_"+receptionPojo.getTimestamp()+".jpg";
            // TODO 上传到OSS
            PutObjectResult ossResult=ossClient.putObject(bucket, ossName, inputStream);
            // TODO 释放临时文件
            inputStream.close();
            // TODO 更新receptionPojo
            receptionPojo.setOssPath(urlPrefix+"/"+ossName);
            return receptionPojo;
        }
    }
}
